package main

import "fmt"

// 查看在切片扩容时关于长度和容器有什么变化
func printSlice(s []int) {
	// 视频的第八分钟
	fmt.Printf("%v len=%d,cap=%d\n", s, len(s), cap(s))
}

func main() {
	// 在go语言中有个特别，zero value for slice is nil
	var s []int

	// 声明了一个空的切片也是可以给追加值的
	for i := 0; i < 100; i++ {
		printSlice(s)
		s = append(s, i)
	}
	fmt.Println(s)

	/**
	创建切片的几种方式
	*/
	s1 := []int{2, 4, 6, 8}
	// [2 4 6 8] len=4,cap=4
	printSlice(s1)

	s2 := make([]int, 16)
	s3 := make([]int, 10, 32)
	// [0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0] len=16,cap=16
	printSlice(s2)
	// [0 0 0 0 0 0 0 0 0 0] len=10,cap=32
	printSlice(s3)

	fmt.Println("Copying slice")
	copy(s2, s1)
	// [2 4 6 8 0 0 0 0 0 0 0 0 0 0 0 0] len=16,cap=16
	printSlice(s2)

	fmt.Println("Deleting elements from slice")
	// 删除索引为3的值
	s2 = append(s2[:3], s2[4:]...)
	// [2 4 6 0 0 0 0 0 0 0 0 0 0 0 0] len=15,cap=16
	printSlice(s2)

	// 去掉切片第一个值
	fmt.Println("Popping from front")
	front := s2[0]
	s2 = s2[1:]
	// 2
	fmt.Println(front)
	// [4 6 0 0 0 0 0 0 0 0 0 0 0 0] len=14,cap=15
	printSlice(s2)

	// 去掉切片的最后一个值
	fmt.Println("Popping form back")
	tail := s2[len(s2)-1]
	s2 = s2[:len(s2)-1]
	// 0
	fmt.Println(tail)
	// [4 6 0 0 0 0 0 0 0 0 0 0 0] len=13,cap=15
	printSlice(s2)
}
